package sgsi.controller;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.springframework.web.servlet.ModelAndView;

import sgsi.controller.dao.AlmacenDao;
import sgsi.controller.dao.ArticuloDao;
import sgsi.controller.dao.ClienteDao;
import sgsi.controller.dao.PaletDao;
import sgsi.controller.dao.TipoDeArticuloDao;
import sgsi.controller.dao.TipoDePaletDao;
import sgsi.model.alocacion.EstadoEnum;
import sgsi.model.comandos.BuscarPaletComando;
import sgsi.model.comandos.GestionarPaletComando;
import sgsi.model.entidades.Palet;
import sgsi.util.Constantes;

/**
 * Clase controladora creada para atender acciones relativas a la gestion de
 * consultas sobre Palets
 * 
 *@See SgsiMultiActionController
 * 
 */
public class ConsultarPalet extends SgsiMultiActionController {

	private TipoDePaletDao tipoDePaletDao;
	private AlmacenDao almacenDao;
	private TipoDeArticuloDao tipoDeArticuloDao;
	private GestionarPalet gestionarPaletController;
	private PaletDao paletDao;
	private ClienteDao clienteDao;
	private ArticuloDao articuloDao;

	/**
	 * Accion para el seteo de atributos iniciales para la pantalla de
	 * Consultas.
	 * <p>
	 * Crea una nueva instacia del comando <code>BuscarPaletComando</code> y la
	 * asocia a la pantalla.
	 * 
	 * @param req
	 *            Objeto HttpServletRequest que modela la peticion por parte de
	 *            la capa de presentaci&oacute;n.
	 * @param resp
	 *            Objeto HttpServletResponse que modela la respuesta del
	 *            servidor.
	 * @return ModelAndView Objecto que modela la Vista a retornar para la capa
	 *         de presentacion: en este caso particular es la pantalla de
	 *         <code>consultas.html</code>.
	 * 
	 * @see BuscarPaletComando
	 */
	public ModelAndView cargaInicial(HttpServletRequest req, HttpServletResponse resp) {
		BuscarPaletComando buscarPaletComando = new BuscarPaletComando();

		buscarPaletComando.setTiposDeArticulos(tipoDeArticuloDao.obtenerTodos());
		buscarPaletComando.setTiposDePalets(tipoDePaletDao.obtenerTodos());
		buscarPaletComando.setAlmacenes(almacenDao.obtenerTodos());
		buscarPaletComando.setEstados(EstadoEnum.getEstadosValidosCombo());

		return new ModelAndView("consultas.html", "command", buscarPaletComando);
	}

	/**
	 * Acci&oacute;n para la busqueda de palets, seg&uacute;n los filtros ingresados en
	 * la pantalla.
	 * <p>
	 * Invoca la busqueda de palets atravez de la clase <code>PaletDao</code>.
	 * Una vez que obtiene la lista resultado; delega la resolucion al
	 * controlador <code>GestionarPalet</code>.
	 * 
	 * @param req
	 *            Objeto HttpServletRequest que modela la peticion por parte de
	 *            la capa de presentaci&oacute;n.
	 * @param resp
	 *            Objeto HttpServletResponse que modela la respuesta del
	 *            servidor.
	 * @param comando
	 *            instancia de BuscarPaletComando con los datos particulares de
	 *            la pantalla de consultas.
	 * @return ModelAndView Objecto que modela la Vista a retornar para la capa
	 *         de presentacion, seg&uacute;n el controlador
	 *         <code>GestionarPalet</code>.
	 */
	public ModelAndView consultar(HttpServletRequest req, HttpServletResponse resp, BuscarPaletComando comando) {

		if (getErrors().hasErrors()) {
			req.setAttribute("errors", getErrors().getAllErrors());
			comando.setTiposDeArticulos(tipoDeArticuloDao.obtenerTodos());
			comando.setTiposDePalets(tipoDePaletDao.obtenerTodos());
			comando.setAlmacenes(almacenDao.obtenerTodos());
			comando.setEstados(EstadoEnum.getEstadosValidosCombo());
			return new ModelAndView("consultas.html", "command", comando);
		}

		int codigo = 0;
		List<Palet> palets = new ArrayList<Palet>();

		if (StringUtils.isNotBlank(comando.getCodigoPalet())) {
			codigo = Integer.parseInt(comando.getCodigoPalet());
		}

		if (codigo != 0) {
			Palet palet = paletDao.obtenerPorCodigo(codigo);
			if (palet != null) {
				palets.add(palet);
			}
		} else {
			String fechaHasta = comando.getFechaDeVencimientoHastaStr();
			String fechaDesde = comando.getFechaDeVencimientoDesdeStr();
			String codigoArticulo = comando.getCodigoArticulo();
			String codigoTipoArticulo = validarCodigo(comando.getCodigoTipoDeArticulo());
			String codigoCliente = comando.getCodigoCliente();
			String codigoAlmacen = validarCodigo(comando.getAlmacenSeleccionado());
			String codigoArea = validarCodigo(comando.getAreaSeleccionado());
			String codigoUbicacion = validarCodigo(comando.getUbicacionSeleccionado());

			String estado = comando.getEstado();

			palets = paletDao.buscarPalet(codigoArticulo, estado, codigoTipoArticulo, codigoCliente, fechaDesde,
					fechaHasta, codigoAlmacen, codigoArea, codigoUbicacion);
		}

		StringBuffer paletsAGestionar = new StringBuffer();
		int cantidad = palets.size();
		for (int j = 0; j < palets.size(); j++) {
			paletsAGestionar.append(palets.get(j).getCodigoPalet());

			if (j != cantidad) {
				paletsAGestionar.append(Constantes.SEPARADOR_DE_PALETS);
			}
		}

		GestionarPaletComando alocarComando = new GestionarPaletComando();
		alocarComando.setPaletsAlocar(paletsAGestionar);
		alocarComando.setTituloBoton1("Realocar Palet");
		alocarComando.setAccion("mostraPopUpEgresos");
		alocarComando.setTituloBoton2("Egresar");
		alocarComando.setConsulta(true);
		req.setAttribute("command", alocarComando);
		return gestionarPaletController.cargaInicial(req, resp);
	}

	private String validarCodigo(int codigo) {
		return (codigo > 0) ? String.valueOf(codigo) : "";
	}

	public void setTipoDePaletDao(TipoDePaletDao tipoDePaletDao) {
		this.tipoDePaletDao = tipoDePaletDao;
	}

	public void setAlmacenDao(AlmacenDao almacenDao) {
		this.almacenDao = almacenDao;
	}

	public void setTipoDeArticuloDao(TipoDeArticuloDao tipoDeArticuloDao) {
		this.tipoDeArticuloDao = tipoDeArticuloDao;
	}

	public void setGestionarPaletController(GestionarPalet gestionarPaletController) {
		this.gestionarPaletController = gestionarPaletController;
	}

	public void setPaletDao(PaletDao paletDao) {
		this.paletDao = paletDao;
	}

	public PaletDao getPaletDao() {
		return paletDao;
	}

	public void setClienteDao(ClienteDao clienteDao) {
		this.clienteDao = clienteDao;
	}

	public ClienteDao getClienteDao() {
		return clienteDao;
	}

	public void setArticuloDao(ArticuloDao articuloDao) {
		this.articuloDao = articuloDao;
	}

	public ArticuloDao getArticuloDao() {
		return articuloDao;
	}

}
